package com.atguigu.gmail.cart.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;

import com.atguigu.gmail.annotations.LoginRequired;
import com.atguigu.gmail.api.bean.OmsCartItem;
import com.atguigu.gmail.api.bean.PmsSkuInfo;
import com.atguigu.gmail.api.service.CartService;
import com.atguigu.gmail.api.service.SkuService;
import com.atguigu.gmail.interceptors.AuthInterceptor;
import com.atguigu.gmail.util.CookieUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Controller
public class CartController {

    @Reference
    SkuService skuService;

    @Reference
    CartService cartService;

    @Autowired
    AuthInterceptor authInterceptor;
    private List<OmsCartItem> omsCartItems;

//    @RequestMapping("toTrade")
//    @LoginRequired(loginSuccess = true)
//    public String toTrade(HttpServletRequest request, HttpServletResponse response, HttpSession session, ModelMap modelMap) {
//
//        /*
//        这里类型强转不能用.toString()，因为可能获取到null，会出现空指针异常
//         */
//        String memberId = (String) request.getAttribute("memberId");
//        String nickname = (String) request.getAttribute("nickname");
//        return "toTrade";
//    }

    /*
    这个方法应该有问题，既然可以不登录，那怎样修改购物车中的选中状态呢
    至少这里应该分两种情况，登录和没有登录，如果没有登录就在cookie中存储选中状态
    或者直接不在服务器存储选中状态，选中状态在结算的时候由页面传递到服务器
     */
    @RequestMapping("checkCart")
    @LoginRequired(loginSuccess = false)
    public String checkCart(String isChecked, String skuId, HttpServletRequest request, HttpServletResponse response, HttpSession session, ModelMap modelMap) {

        String memberId = (String) request.getAttribute("memberId");
        //如果没登录，应该修改cookie，并从cookie中刷新页面
        // 调用服务，修改状态

        if (memberId == null) {
            omsCartItems = flushCookie(request, response, isChecked, skuId);
        } else {
            //如果用户已登录
            OmsCartItem omsCartItem = new OmsCartItem();
            omsCartItem.setMemberId(memberId);
            omsCartItem.setProductSkuId(skuId);
            omsCartItem.setIsChecked(isChecked);
            //将数据插入数据库，并刷新缓存
            cartService.checkCart(omsCartItem);


            // 将最新的数据从缓存中查出，渲染给内嵌页
            omsCartItems = cartService.cartList(memberId);
        }

        modelMap.put("cartList", omsCartItems);
        BigDecimal totalAmount = getTotalAmount(omsCartItems);
        modelMap.put("totalAmount", totalAmount);
        return "cartListInner";
    }

    private List<OmsCartItem> flushCookie(HttpServletRequest request, HttpServletResponse response, String isChecked, String skuId) {
        String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);


            //fastjson将字符串转化为对象的集合
        List<OmsCartItem> cookieomsCartItems = JSON.parseArray(cartListCookie, OmsCartItem.class);


        for (OmsCartItem omsCartItem : cookieomsCartItems) {
            if (omsCartItem.getProductSkuId().equals(skuId)) {
                omsCartItem.setIsChecked(isChecked);
            }
            omsCartItem.setTotalPrice(omsCartItem.getPrice().multiply(omsCartItem.getQuantity()));
        }

        String newCartListCookie = JSON.toJSONString(cookieomsCartItems);
        CookieUtil.setCookie(request, response, "cartListCookie", newCartListCookie, 60 * 60 * 72, true  );
        return cookieomsCartItems;

    }

    @RequestMapping("cartList")
    @LoginRequired(loginSuccess = false)
    public String cartList(HttpServletRequest request, HttpServletResponse response, HttpSession session, ModelMap modelMap) {

        List<OmsCartItem> omsCartItems = new ArrayList<>();
        /*
        因为这个方法肯定会被拦截，而拦截的方法中会设置memberId属性
         */
        String memberId = (String) request.getAttribute("memberId");
        if (StringUtils.isNotBlank(memberId)) {
            // 已经登录查询db
            omsCartItems = cartService.cartList(memberId);
        } else {
            // 没有登录查询cookie
            String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);
            if (StringUtils.isNotBlank(cartListCookie)) {
                //fastjson将字符串转化为对象的集合
                omsCartItems = JSON.parseArray(cartListCookie, OmsCartItem.class);
            }
        }

        for (OmsCartItem omsCartItem : omsCartItems) {
            /*
            bigdecimal不用*，用multiply
             */
            omsCartItem.setTotalPrice(omsCartItem.getPrice().multiply(omsCartItem.getQuantity()));
        }
        BigDecimal totalAmount = getTotalAmount(omsCartItems);
        modelMap.put("totalAmount", totalAmount);
        modelMap.put("cartList", omsCartItems);
        return "cartList";
    }

    private BigDecimal getTotalAmount(List<OmsCartItem> omsCartItems) {
        BigDecimal totalAmount = new BigDecimal("0");

        for (OmsCartItem omsCartItem : omsCartItems) {
            BigDecimal totalPrice = omsCartItem.getTotalPrice();
            if (omsCartItem.getIsChecked().equals("1")) {
                totalAmount = totalAmount.add(totalPrice);
            }

        }

        return totalAmount;
    }

    @RequestMapping("addToCart")
    @LoginRequired(loginSuccess = false)
    public String addToCart(String skuId, int quantity, HttpServletRequest request, HttpServletResponse response, HttpSession session) {

        if (authInterceptor == null) {
            System.out.println("没有扫描到");
        }
        //cookie中的商品列表
        List<OmsCartItem> omsCartItems = new ArrayList<>();

        // 调用商品服务查询商品信息
        PmsSkuInfo skuInfo = skuService.getSkuById(skuId);

        // 将商品信息封装成购物车信息
        OmsCartItem omsCartItem = new OmsCartItem();
        omsCartItem.setCreateDate(new Date());
        omsCartItem.setDeleteStatus(0);
        omsCartItem.setModifyDate(new Date());
        omsCartItem.setPrice(skuInfo.getPrice());
        omsCartItem.setProductAttr("");
        omsCartItem.setProductBrand("");
        omsCartItem.setProductCategoryId(skuInfo.getCatalog3Id());
        omsCartItem.setProductId(skuInfo.getProductId());
        omsCartItem.setProductName(skuInfo.getSkuName());
        omsCartItem.setProductPic(skuInfo.getSkuDefaultImg());
        omsCartItem.setProductSkuCode("11111111111");
        omsCartItem.setProductSkuId(skuId);
        //将前端传过来的int数据转化为BigDecimal
        omsCartItem.setQuantity(new BigDecimal(quantity));
        omsCartItem.setIsChecked("1");

        // 判断用户是否登录
        String memberId = (String) request.getAttribute("memberId");
        String nickname = (String) request.getAttribute("nickname");

        if (StringUtils.isBlank(memberId)) {
            // 用户没有登录

            // cookie里原有的购物车数据
            String cartListCookie = CookieUtil.getCookieValue(request, "cartListCookie", true);
            if (StringUtils.isBlank(cartListCookie)) {
                // cookie为空
                omsCartItems.add(omsCartItem);
            } else {
                // cookie不为空
                omsCartItems = JSON.parseArray(cartListCookie, OmsCartItem.class);
                // 判断添加的购物车数据在cookie中是否存在
                boolean exist = if_cart_exist(omsCartItems, omsCartItem);
                if (exist) {
                    // 之前添加过，更新购物车添加数量
                    for (OmsCartItem cartItem : omsCartItems) {
                        if (cartItem.getProductSkuId().equals(omsCartItem.getProductSkuId())) {
                            cartItem.setQuantity(cartItem.getQuantity().add(omsCartItem.getQuantity()));
                        }
                    }
                } else {
                    // 之前没有添加，新增当前的购物车
                    omsCartItems.add(omsCartItem);
                }
            }

            // 更新cookie
            CookieUtil.setCookie(request, response, "cartListCookie", JSON.toJSONString(omsCartItems), 60 * 60 * 72, true);
        } else {
            // 用户已经登录
            // 从db中查出购物车数据
            OmsCartItem omsCartItemFromDb = cartService.ifCartExistByUser(memberId, skuId);

            if (omsCartItemFromDb == null) {
                // 该用户没有添加过当前商品 memberId是用户id
                omsCartItem.setMemberId(memberId);
                omsCartItem.setMemberNickname(nickname);
                omsCartItem.setQuantity(omsCartItem.getQuantity());
                cartService.addCart(omsCartItem);

            } else {
                // 该用户添加过当前商品,更新购物车中商品的数量
                omsCartItemFromDb.setQuantity(omsCartItemFromDb.getQuantity().add(omsCartItem.getQuantity()));
                cartService.updateCart(omsCartItemFromDb);
            }

            // 同步缓存
            cartService.flushCartCache(memberId);
        }


        return "redirect:/success.html";
    }

    private boolean if_cart_exist(List<OmsCartItem> omsCartItems, OmsCartItem omsCartItem) {

        boolean b = false;

        for (OmsCartItem cartItem : omsCartItems) {
            String productSkuId = cartItem.getProductSkuId();

            if (productSkuId.equals(omsCartItem.getProductSkuId())) {
                b = true;
            }
        }


        return b;
    }

}
